def max2(a,b):
    if a > b:
        return a
    else:
        return b
print(max2(2,3))

def hello(name):
    print("Hello,",name)
hello("Tom")

# 不可变对象
def change(a):
    print(id(a))   # 指向的是同一个对象
    a=10
    print(id(a))   # 一个新对象
 
a=1
print(id(a))
change(a)

# address为默认参数 ; 加了星号 * 的参数会以元组(tuple)的形式导入，存放所有未命名的变量参数。
def print_info(name,age,address="Zhejiang",*varparam):
    print("name:",name,"age:",age,"address:",address,"varparam:",varparam)

# 关键字参数
print_info(age=18,name="Tom")
print_info(age=18,name="Tom",address="Beijing")
# 不定长参数  
print_info(18,"Tom","Xiaoshan","apple","banana")

# 加了两个星号 ** 的参数会以字典的形式导入
def printinfo( arg1, **vardict ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vardict)
 
# 调用printinfo 函数
printinfo(arg1=1, a=2,b=3)

#声明函数时，参数中星号 * 可以单独出现; 则星号 * 后的参数必须用关键字传入
def pp(a,b,*,c,d):
    print(a,b,c,d)
pp(1,2,c=3,d=4)

# 匿名函数 使用 lambda 来创建匿名函数。 匿名函数不需要使用 def 关键字定义完整函数。
# lambda 函数通常用于编写简单的、单行的函数，通常在需要函数作为参数传递的情况下使用，例如在 map()、filter()、reduce() 等函数中。
# lambda 函数语法格式：lambda arguments: expression
add = lambda a,b:a+b
print(add(1,2))

def myFunc(n):
    return lambda a,b : a+b+n
firstFunc = myFunc(1)
print(firstFunc(1,2))
print(firstFunc(2,3))

# 强制位置参数
# Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数，不能使用关键字参数的形式。
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
f(1,2,3,4,e=5,f=6)

def f2():
    a=1+1
print(f2())
 

def recursion_add(n):
    if n == 1:
        return 1
    else:
        return n + recursion_add(n-1)
print(recursion_add(4))

from math import pi
print(pi)

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出: [1, 4, 9, 16, 25]

print(list(filter(lambda x:x>2, [1,2,3,4,5])))

# reduce() 函数通过遍历 numbers 列表，并使用 lambda 函数将累积的结果不断更新，最终得到了 1 * 2 * 3 * 4 * 5 = 120 的结果。
from functools import reduce
print(reduce(lambda x, y: x * y, [1, 2, 3, 4, 5]))